import matplotlib.pyplot as plt
import numpy as np

# 数据准备
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 绘制简单图形
plt.plot(x, y)
plt.title("Simple Line Plot")
plt.xlabel("X Axis")
plt.ylabel("Y Axis")
plt.show()

# 设置标题与标签
plt.plot(x, y)
plt.title("Title: Sine Wave")
plt.xlabel("X Axis: Time")
plt.ylabel("Y Axis: Amplitude")
plt.show()

# 添加图例
y2 = np.cos(x)
plt.plot(x, y, label="Sine Wave")
plt.plot(x, y2, label="Cosine Wave")
plt.legend(['Sine', 'Cosine'])
plt.show()

# 折线图
plt.plot(x, y)
plt.title("Sine Wave Over Time")
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.show()

# 散点图
y_random = np.random.rand(100)
plt.scatter(x, y_random)
plt.title("Random Scatter Plot")
plt.xlabel("X Axis")
plt.ylabel("Y Axis")
plt.show()

# 柱状图
categories = ['A', 'B', 'C', 'D']
values = [5, 7, 3, 9]
plt.bar(categories, values)
plt.title("Bar Chart Example")
plt.xlabel("Categories")
plt.ylabel("Values")
plt.show()

# 直方图
data = np.random.randn(1000)
plt.hist(data, bins=30)
plt.title("Histogram of Random Data")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.show()

# 饼图
sizes = [15, 30, 45, 10]
labels = ['Category A', 'Category B', 'Category C', 'Category D']
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.title("Pie Chart Example")
plt.show()

# 箱线图
data_box = np.random.randn(100)
plt.boxplot(data_box)
plt.title("Box Plot Example")
plt.show()

# 多子图绘制
plt.subplot(2, 2, 1)
plt.plot(x, y)
plt.title("Subplot 1")

plt.subplot(2, 2, 2)
plt.scatter(x, y_random)
plt.title("Subplot 2")

plt.subplot(2, 2, 3)
plt.hist(data, bins=10)
plt.title("Subplot 3")

plt.subplot(2, 2, 4)
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.title("Subplot 4")

plt.tight_layout()  # 调整子图布局
plt.show()

# 坐标轴范围与刻度设置
plt.plot(x, y)
plt.xlim(0, 10)
plt.ylim(-1, 1)
plt.xticks(np.arange(0, 11, 1))
plt.yticks(np.linspace(-1, 1, 5))
plt.title("Custom Axis Limits and Ticks")
plt.show()

# 线条样式与颜色
plt.plot(x, y, linestyle='--', color='r')
plt.title("Dashed Red Line")
plt.show()

# 文本与注释
plt.plot(x, y)
plt.text(5, 0, 'Middle Point', fontsize=12, color='red')
plt.annotate('Peak', xy=(1.5, np.sin(1.5)), xytext=(2, 0.5),
             arrowprops=dict(facecolor='blue', arrowstyle='->'))
plt.title("Text and Annotations")
plt.show()

# 图形保存
plt.plot(x, y)
plt.title("Save Plot Example")
plt.savefig("sine_wave_plot.png")

# 图形网格与样式
plt.style.use('seaborn-darkgrid')  # 使用 seaborn 风格
plt.plot(x, y)
plt.grid(True)  # 添加网格
plt.title("Styled Plot with Grid")
plt.show()
